const { sequelize } = require('../cors/db');
const { Sequelize, Model } = require('sequelize');
const bcrypt = require('bcryptjs') //bcryptjs密码加密
class User extends Model {
    static async verifyEmailPassword(email, plainPassword) {

        // 查询用户
        const user = await User.findOne({  //查询
            where: {
                email
            }
        })

        if (!user) {
            throw new global.errs.AuthFailed('账号不存在')
        }
        // 验证密码
        const correct = bcrypt.compareSync(plainPassword, user.password) //compareSync 翻译
        if (!correct) {
            throw new global.errs.AuthFailed('密码不正确')
        }

        return user
    }

    // 查询是否存在 opendid 的小程序用户
    static async getUserByOpenid(openid) { 
        // 查询用户
        const user = await User.findOne({
            where: {
                openid
            }
        })

        return user;
    }

    // 注册小程用户
    static async createUserByOpenid(openid) {
        // 查询用户
        const user = await User.create({
            openid
        })

        return user;
    }
}
// 初始用户模型 创建表格
User.init({
    id: {
        type: Sequelize.INTEGER, //Sequelize.INTEGER 数字
        primaryKey: true,//   primaryKey: true  设计成主键
        autoIncrement: true// autoIncrement: true ID 编号自动增长
        //最好是数字不要使用随机字符串GUID 这样会影响速度
    },
    nickname: Sequelize.STRING, //字符串类型Sequelize.STRING
    email: {
        type: Sequelize.STRING(128),
        unique: true //唯一值
    }, 
    password: {
        // 扩展 设计模式 观察者模式
        // ES6 Reflect Vue3.0
        type: Sequelize.STRING,
        //设计模式 观察者模式的运用
        set(val) { 
            // 加密
            const salt = bcrypt.genSaltSync(10)  //genSaltSync同步方法10是指计算生产的成本
            // 生成加密密码
            const psw = bcrypt.hashSync(val, salt)//hashSync 生成加密办法
            this.setDataValue("password", psw) //吧加密过后的值放进去
        }
    },
    openid: {
        type: Sequelize.STRING(64), //字符串类型Sequelize.STRING(64)长度最大64
        unique: true //   unique: true  唯一的
    },
}, {
        sequelize,
        tableName: 'user' //表名字
    })
module.exports = {
    User
}
